import axios from "axios";
import { ElMessage } from "element-plus";

// 创建axios实例
const instance = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL || "http://files.yujianweb.com", // API基础路径
  // baseURL: import.meta.env.VITE_API_BASE_URL || "http://textfile.yujianweb.com", // API基础路径
  timeout: 40000, // 请求超时时间
});

// 存储当前未完成的请求的取消函数（用于全局取消）
let pendingRequests = new Map();
// 生成唯一请求标识（用于区分不同请求）
const getRequestKey = (config) => {
  return [
    config.url,
    config.method,
    JSON.stringify(config.params),
    JSON.stringify(config.data),
  ].join("&");
};

// 请求拦截器
instance.interceptors.request.use(
  (config) => {
    // 在发送请求前做些什么
    // 例如添加token
    const token = localStorage.getItem("token");
    if (token) {
      config.headers["Authorization"] = `Bearer ${token}`;
    }
    // 为每个请求生成唯一的AbortController
    const abortController = new AbortController();
    const signal = abortController.signal;
    config.signal = signal; // ##将signal注入请求配置##

    // 生成请求唯一标识
    const requestKey = getRequestKey(config);
    // 存储取消函数（用于后续取消）
    pendingRequests.set(requestKey, abortController);
    return config;
  },
  (error) => {
    // 处理请求错误
    console.error("请求错误:", error);
    return Promise.reject(error);
  }
);

// 响应拦截器
instance.interceptors.response.use(
  (response) => {
    // 请求成功后，从pendingRequests中移除该请求的取消函数
    const requestKey = getRequestKey(response.config);
    pendingRequests.delete(requestKey);
    // 2xx范围内的状态码都会触发此函数
    // 处理响应数据
    const res = response.data;
    // if (res.code !== 200) {
    //   // 自定义错误处理
    //   console.error("响应错误:", res.message);
    //   return Promise.reject(new Error(res.message || "Error"));
    // } else {
    return res;
    // }
  },
  (error) => {
    // 处理取消请求的错误（避免干扰业务错误提示）
    if (axios.isCancel(error)) {
      console.error("请求已取消:", error.message);
      // return Promise.reject(new Error("请求已取消")); //返回自定义取消提示
    }
    // 超出2xx范围的状态码都会触发此函数
    // 处理响应错误
    console.error("响应错误:", error.response.data.message);
    return Promise.reject(error.response.data);
  }
);

// 常用请求方法封装
export const request = {
  get(url, params = {}, config = {}) {
    return instance.get(url, { params, ...config });
  },
  post(url, data = {}, config = {}) {
    return instance.post(url, data, config);
  },
  put(url, data = {}, config = {}) {
    return instance.put(url, data, config);
  },
  delete(url, params = {}, config = {}) {
    return instance.delete(url, { params, ...config });
  },
};

// 全局取消所有未完成请求的方法（可选）
export const cancelAllPendingRequests = () => {
  pendingRequests.forEach((controller) => controller.abort("页面切换，取消请求"));
  pendingRequests.clear();
};

export default instance;
